﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IObject.h"

namespace gcmp
{
    class IGraphicsStyleData;
    class IGdcLinkModelView;
    class IGraphicsElementShape;

    typedef std::function<void(ElementId oElementId, IGraphicsElementShape* pGrep)> UnPackElementCallback;

    /// \brief 链接视图管理器接口
    class GCMP_MODEL_INTERFACE_EXPORT IGdcLinkModelViewManager : public IObject
    {
        DEFINE_CAST_DERIVED(IGdcLinkModelViewManager, IObject)
    public:
        ~IGdcLinkModelViewManager();

        /// \brief 添加一个链接视图
        ///
        /// 只用于主文档，链接文档不起作用
        /// \param elementId 视图元素的ElementId
        /// \return true - 成功，false - 失败
        virtual bool Add(const ElementId& elementId) = 0;

        /// \brief 删除一个链接视图
        ///
        /// 只用于主文档，链接文档不起作用
        /// \param elementId 视图元素的ElementId
        /// \return true - 成功，false - 失败
        virtual bool Remove(const ElementId& elementId) = 0;

        /// \brief 获取一个链接视图
        /// \param elementId 视图元素的ElementId
        /// \return 链接视图对象
        virtual const IGdcLinkModelView* Get(const ElementId& elementId) const = 0;

        /// \brief 获取一个链接视图
        /// \param elementId 视图元素的ElementId
        /// \return 链接视图对象
        virtual IGdcLinkModelView* Get(const ElementId& elementId) = 0;

        /// \brief 获取一个链接视图
        /// \param elementId 视图元素的ElementId
        /// \param extraData 视图元素的补充数据
        /// \return 链接视图对象
        virtual const IGdcLinkModelView* Get(const ElementId& elementId, const std::map<std::wstring, std::wstring>& extraData) const = 0;

        /// \brief 获取一个链接视图
        /// \param elementId 视图元素的ElementId
        /// \param extraData 视图元素的补充数据
        /// \return 链接视图对象
        virtual IGdcLinkModelView* Get(const ElementId& elementId, const std::map<std::wstring, std::wstring>& extraData) = 0;

        /// \brief 获取默认三维链接视图
        /// \return 链接视图对象
        virtual const IGdcLinkModelView* GetDefault3D() const = 0;

        /// \brief 获取默认三维链接视图
        /// \return 链接视图对象
        virtual IGdcLinkModelView* GetDefault3D() = 0;

        /// \brief 获取所有链接视图对象
        /// \return 链接视图对象数组
        virtual const std::vector<OwnerPtr<IGdcLinkModelView>>& GetLinkModelViews() const = 0;

        /// \brief 获取所有链接视图对象
        /// \return 链接视图对象数组
        virtual std::vector<OwnerPtr<IGdcLinkModelView>>& GetLinkModelViews() = 0;

        /// \brief 获取对象样式数据
        /// \param index 对象样式数据的索引值
        /// \return 对象样式数据
        virtual OwnerPtr<IGraphicsStyleData> GetGraphicsStyleData(size_t index) const = 0;

        /// \brief 更新所有链接视图对象
        /// \param bForceGenerateModelViewElementShapes 是否强制生成视图图形节点
        /// \return true - 成功，false - 失败
        virtual bool UpdateAllLinkModelViews(bool bForceGenerateModelViewElementShapes) = 0;

        /// \brief 更新默认三维视图对象
        /// \return true - 成功，false - 失败
        virtual bool UpdateDefault3DView() = 0;

        /// \brief 清除所有链接视图对象和样式数据
        /// \return true - 成功，false - 失败
        virtual bool Clear() = 0;

        /// \brief 导出链接视图对象数据到指定路径
        /// \param path 导出文件的完整文件名
        /// \return true - 成功；false - 失败
        virtual bool ExportGraphicsStyleData(const std::wstring& path) const = 0;

        /// \brief 从指定文件导入链接视图对象
        /// \param uri 导入文件的URI
        /// \return true - 成功，false - 失败
        virtual bool ImportGraphicsStyleData(const std::wstring& uri) = 0;

        /// \brief 导出链接视图填充数据到指定路径
        /// \param path 导出文件的完整文件名
        /// \return true - 成功；false - 失败
        virtual bool ExportGraphicsFillPatternData(const std::wstring& path) const = 0;

        /// \brief 从指定文件导入链接视图填充对象
        /// \param uri 导入文件的URI
        /// \return true - 成功，false - 失败
        virtual bool ImportGraphicsFillPatternData(const std::wstring& uri) = 0;

        /// \brief 导出链接视图线型数据到指定路径
        /// \param path 导出文件的完整文件名
        /// \return true - 成功；false - 失败
        virtual bool ExportGraphicsLineTypeData(const std::wstring& path) const = 0;

        /// \brief 从指定文件导入链接视图线型对象
        /// \param uri 导入文件的URI
        /// \return true - 成功，false - 失败
        virtual bool ImportGraphicsLineTypeData(const std::wstring& uri) = 0;

        /// \brief 以Zip压缩包的方式导出视图数据至指定目录
        /// 
        /// \param pLinkModelView 指定的链接视图数据
        /// \param path 导出数据的路径（导出格式为.zip，zip中以一个Json文件存储视图中的所有数据）
        /// \return true - 成功；false - 失败
        virtual bool ExportModelView(const IGdcLinkModelView* pLinkModelView, const std::wstring& path) const = 0;

        /// \brief 从指定目录导入视图数据
        /// 
        /// \param dataInfo 视图的MetaData，包含视图名称和视图的ElementId，目前暂定dataInfo为根据JSon得到的RawString，格式如下
        ///                 {"modelViewId":"",
        ///                  "modelViewName":""}
        /// \param uri 视图数据的URI（该数据应为通过ExportModelView导出得到的试图数据压缩包）
        /// \return 通过视图数据压缩包解压并反序列化后得到的链接视图数据，此时其中的图形表达和样式数据尚未加载，会在获取这些数据时进行动态加载
        virtual IGdcLinkModelView* ImportModelView(const std::wstring& dataInfo, const std::wstring& uri) = 0;

        /// \brief 以Zip压缩包的方式导出导致视图Grep重建的因素至指定目录
        /// 
        /// \param path 导出数据的路径（导出格式为.zip，zip中以一个Json文件存储视哪些因素发生变化需要重建viewGrep）
        /// \return true - 成功；false - 失败
        virtual bool ExportRebuildElementViewShapeFactors(const std::wstring& path) const = 0;

        /// \brief 从指定文件导入导致视图Grep重建的因素
        /// \param uri 导入文件的URI
        /// \return true - 成功，false - 失败
        virtual bool ImportRebuildElementViewShapeFactors(const std::wstring& uri) = 0;

        /// \brief 查找element是否会因指定因素改变而重建视图grep
        /// \param rebuildFactor 重新绘制的因素
        /// \param elementId 要查找Element的Id
        /// \return true - 需要重建视图Grep，false - 不需要
        virtual bool NeedRebuildElementViewShape(const std::wstring& rebuildFactor, const ElementId& elememtId) const = 0;

        /// \brief 设置解压Element的回调函数
        /// 
        /// \param func 解压Element回调函数，该函数会在每个Element（含Grep）创建完成后调用
        virtual void SetUnPackElementCallback(UnPackElementCallback func) = 0;
    };
}
